home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 1
/
Gekikoh Dennoh Club Vol. 1 (Japan).7z
/
Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin
/
tools
/
pcd2
/
src
/
pcd_ms.has
< prev
next >
Wrap
Text File
|
1997-02-06
|
9KB
|
468 lines
**************************************************
* マウス関連サブルーチン
*
* 実行形式・ソース共、利用に制限はありませんが
* 無保証であることだけは保証します
* by まる丸 1997
**************************************************
*------------------------------
* インクルード&外部参照
*------------------------------
.include iocscall.mac
.include c:\free\agiocs\agiocs.mac
.xref V_FLAME
.xref SW_S,SW_LX,SW_LY
.xref M_TBL_X,M_TBL_Y,M_TBL_J,SEL
.xdef MS_INIT,MS_CHECK,MScsrON,MScsrOFF
.xdef G_MODE,limitB
*------------------------------
* プログラム部
*------------------------------
.cpu 68000
.text
.align 4
*------------------------------
* マウスの初期設定
*------------------------------
MS_INIT:
movem.l d0-d1,-(sp)
clr.b MS_FLG
tst.l V_FLAME
bmi @f
clr.w limitB
moveq.l #-1,d1
IOCS _CRTMOD
cmpi.b #12,d0
beq 2f
move.b #3,G_MODE
move.w #767,limitE
bra 1f
2: move.b #2,G_MODE
move.w #767,limitE
bra 1f
@@: tst.b SW_S
bne @f
clr.w limitB
move.w #511,limitE
clr.b G_MODE
bra 1f
@@: move.w #128,limitB
move.w #639,limitE
move.b #1,G_MODE
1: IOCS _MS_CURGT *マウスカーソルの位置ゲット
cmpi.w #511,d0
bls @f
move.w #500,d0
@@: swap d0
cmp.w limitB,d0
bcc @f
move.w SW_LX,d0
add.w #10,d0
bra 1f
@@: cmp.w limitE,d0
bls 1f
move.w limitE,d0
sub.w #10,d0
1: swap d0
bsr MScsrSET
move.l d0,MS_X
clr.b FLG_MS
movem.l (sp)+,d0-d1
rts
*------------------------------
* マウスが押されたかチェック
*------------------------------
MS_CHECK:
tst.b MS_FLG
bne 1f
bsr MS_DRAW
IOCS _MS_GETDT *左ボタンが押されているか
tst.w d0 *押されていなければ
bge 1f *終り
@@: bsr MS_DRAW
IOCS _MS_GETDT *左ボタンが押されているか
tst.w d0 *押されていれば
bmi @b *離されるまでループ
bsr get_num
rts
1: clr.l d0
rts
*------------------------------
* マウス座標をメニュー番号に変換
*------------------------------
get_num:
tst.b FLG_MS
beq 3f
movem.l d1-d4/a0-a1,-(sp)
tst.b MS_FLG
bne 4f
lea.l M_TBL_X,a0
lea.l M_TBL_Y,a1
move.w SEL,d1
subq.w #1,d1
moveq.l #0,d2
move.w MS_X,d3
move.w MS_Y,d4
1: cmp.w 0(a1,d2.w),d4
bcs @f
cmp.w 2(a1,d2.w),d4
bhi @f
cmp.w 0(a0,d2.w),d3
bcs @f
cmp.w 2(a0,d2.w),d3
bhi @f
lsr.w #2,d2
move.l d2,d0
addq.l #1,d0
bra 2f
@@: addq.w #4,d2
dbra d1,1b
4: moveq.l #0,d0
2: movem.l (sp)+,d1-d4/a0-a1
rts
3: moveq.l #1,d0
rts
*------------------------------
* マウスカーソルの描画
*------------------------------
MS_DRAW:
tst.b MS_FLG
bne 1f
movem.l d0,-(sp)
IOCS _MS_CURGT *マウスカーソルの位置ゲット
bsr MScsrSET *マウスカーソルの位置セット
tst.b FLG_MS *マウスカーソルは表示されているか?
beq @f *してなければ終わり
cmp.l MS_X,d0 *位置は前回と同じか
beq @f *同じなら終わり
bsr MScsrOFF *違ったら一度消して
move.l d0,MS_X *新しい座標で
bsr MScsrON *表示
@@: move.l d0,MS_X
movem.l (sp)+,d0
1: rts
*------------------------------
* マウスカーソル表示
*------------------------------
MScsrON:
tst.b MS_FLG
bne 1f
tst.b FLG_MS
bne 1f
movem.l d0-d2,-(sp)
clr.l d0
move.w #12,d2
move.w MS_X,d0
sub.w limitB,d0 *書き込み開始X座標
move.w d0,d1
add.w d2,d1
sub.w limitE,d1
add.w limitB,d1
subq.w #1,d1
ble @f
sub.w d1,d2 *マウスの横ドット数
@@: swap d2
move.w #16,d2
move.w MS_Y,d1 *書き込み開始Y座標
add.w d2,d1
sub.w #512,d1
ble @f
sub.w d1,d2 *マウスの縦ドット数
@@: move.l d2,MS_sx
tst.l V_FLAME
bge @f
clr.l d1
move.w MS_Y,d1 *Y座標を
swap d1 *1024倍して
lsr.l #6,d1
add.w d0,d0 *X座標を2倍した数値を
add.l d0,d1 *足し算し
add.l #$c00000,d1 *G-RAMの先頭アドレスを足せば
move.l d1,MS_ADR *書き込み開始アドレスになる
@@: bsr get_gram
bsr put_csr
st.b FLG_MS
movem.l (sp)+,d0-d2
1: rts
*------------------------------
* グラフィック退避
*------------------------------
get_gram:
tst.b MS_FLG
bne 2f
tst.l V_FLAME
bge get_GA
movem.l d0-d2/a0-a3,-(sp)
suba.l a1,a1
IOCS _B_SUPER
move.l d0,a3
move.l MS_ADR,a0
move.l a0,a1
move.l MS_sx,d0
move.w d0,d2
subq.w #1,d2
swap d0
subq.w #1,d0
lea.l MS_BUF,a2
1: move.l a0,a1
move.w d0,d1
@@: move.w (a1)+,(a2)+
dbra d1,@b
add.l #1024,a0
dbra d2,1b
move.l a3,a1
IOCS _B_SUPER
movem.l (sp)+,d0-d2/a0-a3
2: rts
get_GA:
movem.l d0-d5/a0-a3,-(sp)
suba.l a1,a1
IOCS _B_SUPER
move.l d0,a3
move.w MS_sx,d3
subq.w #1,d3
lea.l MS_BUF,a2
move.l MS_X,d4
@@: moveq.l #15,d5
1: move.l d4,d2
AGIOCS _A_G_GETFRM
move.l a1,a0
move.w d3,d1
@@: move.w (a0)+,(a2)+
move.w (a0)+,(a2)+
dbra d1,@b
move.l d0,d2
AGIOCS _A_G_SETFRM
addq.w #1,d4
cmpi.w #512,d4
dbcc d5,1b
move.l a3,a1
IOCS _B_SUPER
movem.l (sp)+,d0-d5/a0-a3
rts
*------------------------------
* グラフィック復帰
*------------------------------
put_gram:
tst.b MS_FLG
bne 2f
tst.l V_FLAME
bge put_GA
movem.l d0-d2/a0-a3,-(sp)
suba.l a1,a1
IOCS _B_SUPER
move.l d0,a3
move.l MS_ADR,a0
move.l a0,a1
move.l MS_sx,d0
move.w d0,d2
subq.w #1,d2
swap d0
subq.w #1,d0
lea.l MS_BUF,a2
1: move.l a0,a1
move.w d0,d1
@@: move.w (a2)+,(a1)+
dbra d1,@b
add.l #1024,a0
dbra d2,1b
move.l a3,a1
IOCS _B_SUPER
movem.l (sp)+,d0-d2/a0-a3
2: rts
put_GA:
movem.l d0-d5/a0-a3,-(sp)
suba.l a1,a1
IOCS _B_SUPER
move.l d0,a3
move.w MS_sx,d3
subq.w #1,d3
lea.l MS_BUF,a2
move.l MS_X,d4
moveq.l #15,d5
1: move.l d4,d2
AGIOCS _A_G_GETFRM
move.l a1,a0
move.w d3,d1
@@: move.w (a2)+,(a0)+
move.w (a2)+,(a0)+
dbra d1,@b
move.l d0,d2
AGIOCS _A_G_SETFRM
addq.w #1,d4
cmpi.w #512,d4
dbcc d5,1b
move.l a3,a1
IOCS _B_SUPER
movem.l (sp)+,d0-d5/a0-a3
rts
*------------------------------
* マウスカーソル書き込み
*------------------------------
put_csr:
tst.b MS_FLG
bne 3f
tst.l V_FLAME
bge csr_GA
movem.l d0-d3/a0-a3,-(sp)
suba.l a1,a1
IOCS _B_SUPER
move.l d0,a3
move.l MS_ADR,a0
move.l a0,a1
move.l MS_sx,d0
move.w d0,d2
subq.w #1,d2
swap d0
lea.l MS_data,a2
1: move.l a0,a1
move.w d0,d1
move.w (a2)+,d3
2: subq.w #1,d1
bmi @f
move.w (a2),(a1)+
@@: addq.l #2,a2
dbra d3,2b
add.l #1024,a0
dbra d2,1b
move.l a3,a1
IOCS _B_SUPER
movem.l (sp)+,d0-d3/a0-a3
3: rts
csr_GA:
movem.l d0-d6/a0-a3,-(sp)
suba.l a1,a1
IOCS _B_SUPER
move.l d0,a3
lea.l MS_data,a2
move.w MS_sx,d3
move.l MS_X,d4
moveq.l #15,d6
1: move.l d4,d2
AGIOCS _A_G_GETFRM
move.l a1,a0
move.w d3,d1
move.w (a2)+,d5
2: subq.w #1,d1
bmi @f
move.w (a2),(a0)+
move.w (a2),(a0)+
@@: addq.l #2,a2
dbra d5,2b
move.l d0,d2
AGIOCS _A_G_SETFRM
addq.l #1,d4
cmpi.w #512,d4
dbcc d6,1b
move.l a3,a1
IOCS _B_SUPER
movem.l (sp)+,d0-d6/a0-a3
rts
*------------------------------
* マウスカーソル消去
*------------------------------
MScsrOFF:
tst.b FLG_MS
beq @f
bsr put_gram
clr.b FLG_MS
@@: rts
*------------------------------
* マウスの座標指定
*------------------------------
MScsrSET:
tst.b MS_FLG
bne 2f
movem.l d1-d2,-(sp)
cmpi.w #511,d0
bls @f
move.w #511,d0
@@: swap d0
cmp.w limitB,d0
bcc @f
move.w limitB,d0
bra 1f
@@: cmp.w limitE,d0
bls 1f
move.w limitE,d0
1: swap d0
move.l d0,d2
move.l d0,d1
IOCS _MS_CURST
tst.l d0
bge @f
st.b MS_FLG *マウス使用不可
@@: cmpi.b #2,G_MODE
bne @f
swap d2
move.w d2,d0
add.w d2,d2
add.w d0,d2
lsr.w #1,d2
swap d2
@@: exg d2,d0
movem.l (sp)+,d1-d2
rts
2: clr.l d0
rts
*------------------------------
* 固定データ部
*------------------------------
.data
.align 4
MS_data:
.dc.w 0, 0
.dc.w 1, 0, 0
.dc.w 2, 0,-1, 0
.dc.w 3, 0,-1,-1, 0
.dc.w 4, 0,-1,-1,-1, 0
.dc.w 5, 0,-1,-1,-1,-1, 0
.dc.w 6, 0,-1,-1,-1,-1,-1, 0
.dc.w 7, 0,-1,-1,-1,-1,-1,-1, 0
.dc.w 8, 0,-1,-1,-1,-1,-1,-1,-1, 0
.dc.w 9, 0,-1,-1,-1,-1,-1,-1,-1,-1, 0
.dc.w 10, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0
.dc.w 11, 0,-1,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0
.dc.w 3, 0,-1,-1, 0
.dc.w 2, 0,-1, 0
.dc.w 1, 0, 0
.dc.w 0, 0
*------------------------------
* ワークエリア
*------------------------------
.bss
.align 4
MS_limit:
limitB: .ds.w 1 *マウスX方向の移動範囲
limitE: .ds.w 1 *マウスX方向の移動範囲
MS_X: .ds.w 1 *マウスのX座標
MS_Y: .ds.w 1 *マウスのY座標
MS_sx: .ds.w 1 *マウスカーソルの横サイズ
MS_sy: .ds.w 1 *マウスカーソルの縦サイズ
MS_ADR: .ds.l 1
MS_BUF: .ds.l 384 *12x16
FLG_MS: .ds.b 1
MS_FLG: .ds.b 1 *0=マウス使用可能 0以外使用不能
G_MODE: .ds.b 1 *3:2=0 1:1=1 GA3:2=2 GA1:1=3